home *** CD-ROM | disk | FTP | other *** search
/ Workbench Add-On / Workbench Add-On - Volume 1.iso / BBS-Archive / Dev / Obrn-A_1.6_lib.lha / oberon-a / source3.lha / source / Library / Strings2.mod < prev    next >
Text File  |  1995-06-29  |  5KB  |  217 lines

  1. (***************************************************************************
  2.  
  3.      $RCSfile: Strings2.mod $
  4.   Description: More string manipulation
  5.  
  6.    Created by: fjc (Frank Copeland)
  7.     $Revision: 1.5 $
  8.       $Author: fjc $
  9.         $Date: 1995/06/29 19:04:45 $
  10.  
  11.   Copyright © 1994-1995, Frank Copeland.
  12.   This file is part of the Oberon-A Library.
  13.   See Oberon-A.doc for conditions of use and distribution.
  14.  
  15. ***************************************************************************)
  16.  
  17. <*$ IndexChk- *>
  18.  
  19. (* Index checking is handled explicitly by the relevant procedures. *)
  20.  
  21. MODULE Strings2;
  22.  
  23. IMPORT SYS := SYSTEM, Strings;
  24.  
  25. PROCEDURE Min ( a, b : INTEGER ) : INTEGER;
  26. BEGIN (* Min *)
  27.   IF a < b THEN RETURN a
  28.   ELSE RETURN b
  29.   END
  30. END Min;
  31.  
  32.  
  33. PROCEDURE Max ( a, b : INTEGER ) : INTEGER;
  34. BEGIN (* Max *)
  35.   IF a > b THEN RETURN a
  36.   ELSE RETURN b
  37.   END
  38. END Max;
  39.  
  40.  
  41. (*------------------------------------*)
  42. PROCEDURE OverWrite *
  43.   ( source     : ARRAY OF CHAR;
  44.     pos      : INTEGER;
  45.     VAR dest : ARRAY OF CHAR );
  46. (*
  47.   Overwrites the contents of "dest" with "source", starting at "pos".
  48.   Truncates where necessary.
  49. *)
  50.  
  51.   VAR len : INTEGER;
  52.  
  53. <*$CopyArrays-*>
  54. BEGIN (* OverWrite *)
  55.   len := Min (Strings.Length (source), Strings.Length (dest) - pos);
  56.   IF len > 0 THEN
  57.     SYS.MOVE (SYS.ADR (source), SYS.ADR (dest [pos]), len)
  58.   END
  59. END OverWrite;
  60.  
  61.  
  62. (*------------------------------------*)
  63. PROCEDURE OverWriteSubString *
  64.   ( source          : ARRAY OF CHAR;
  65.     start, len, pos : INTEGER;
  66.     VAR dest        : ARRAY OF CHAR );
  67. (*
  68.   Overwrites the contents of dest [pos ...] with source [start ..
  69.   (start + len - 1)]. Truncates or extends where necessary.
  70. *)
  71.  
  72.   VAR len2 : INTEGER;
  73.  
  74. <*$CopyArrays-*>
  75. BEGIN (* OverWriteSubString *)
  76.   len2 :=
  77.     Min (Min (len, Strings.Length (source) - start), Strings.Length (dest) - pos );
  78.   IF len2 > 0 THEN
  79.     SYS.MOVE (SYS.ADR (source), SYS.ADR (dest [pos]), len2)
  80.   END
  81. END OverWriteSubString;
  82.  
  83.  
  84. (*------------------------------------*)
  85. PROCEDURE FindChar *
  86.   ( char : CHAR;
  87.     str  : ARRAY OF CHAR;
  88.     pos  : INTEGER )
  89.   : INTEGER;
  90. (*
  91.   Searches "str" for the first occurrence of "char", starting at "pos"
  92.   and returns its position if found, otherwise it returns -1.
  93. *)
  94.  
  95.   VAR lim : INTEGER;
  96.  
  97. <*$CopyArrays-*>
  98. BEGIN (* FindChar *)
  99.   lim := Strings.Length (str);
  100.   WHILE (pos < lim) & (str [pos] # char) DO
  101.     INC(pos);
  102.   END;
  103.   IF pos = lim THEN RETURN -1 ELSE RETURN pos END
  104. END FindChar;
  105.  
  106.  
  107. (*------------------------------------*)
  108. PROCEDURE CompareCAP *
  109.   ( str1, str2 : ARRAY OF CHAR )
  110.   : SHORTINT;
  111. (*
  112.   Returns the result of the lexical comparison of the two strings. Returns
  113.   -1 if (str1 < str2), 0 if (str1 = str2) and 1 if
  114.   (str1 > str2). The case of the strings is ignored.
  115. *)
  116.  
  117.   VAR
  118.     len1, len2, index, lim : INTEGER;
  119.     result : SHORTINT; ch1, ch2 : CHAR;
  120.  
  121. <*$CopyArrays-*>
  122. BEGIN (* CompareCAP *)
  123.   len1 := Strings.Length (str1); len2 := Strings.Length (str2);
  124.   lim := Min (len1, len2); index := 0;
  125.   LOOP
  126.     IF (index = lim) THEN
  127.       IF (len1 < len2) THEN result := -1;
  128.       ELSIF (len1 > len2) THEN result := 1;
  129.       ELSE result := 0;
  130.       END;
  131.       EXIT;
  132.     END;
  133.     ch1 := CAP (str1 [index]); ch2 := CAP (str2 [index]);
  134.     IF ch1 < ch2 THEN result := -1; EXIT
  135.     ELSIF ch1 > ch2 THEN result := 1; EXIT
  136.     END;
  137.     INC (index);
  138.   END;
  139.   RETURN result;
  140. END CompareCAP;
  141.  
  142.  
  143. (*------------------------------------*)
  144. PROCEDURE TrimLeft *
  145.   ( char : CHAR;
  146.     VAR str : ARRAY OF CHAR );
  147. (*
  148.   Deletes any instances of "char" from the start of "str".
  149. *)
  150.  
  151.   VAR len : INTEGER;
  152.  
  153. BEGIN (* TrimLeft *)
  154.   len := 0; WHILE (str [len] = char) DO INC (len) END;
  155.   IF len > 0 THEN Strings.Delete (str, 0, len) END
  156. END TrimLeft;
  157.  
  158.  
  159. (*------------------------------------*)
  160. PROCEDURE TrimRight *
  161.   ( char : CHAR;
  162.     VAR str : ARRAY OF CHAR );
  163. (*
  164.   Deletes any instances of "char" from the end of "str".
  165. *)
  166.  
  167.   VAR pos : INTEGER;
  168.  
  169. BEGIN (* TrimRight *)
  170.   pos := Strings.Length (str) - 1;
  171.   WHILE (str [pos] = char) DO DEC (pos) END;
  172.   str [pos] := 0X;
  173. END TrimRight;
  174.  
  175.  
  176. (*------------------------------------*)
  177. PROCEDURE Fill *
  178.   ( char       : CHAR;
  179.     pos, len : INTEGER;
  180.     VAR str : ARRAY OF CHAR );
  181. (*
  182.   Fills str with char, beginning at pos character for len
  183.   characters.
  184. *)
  185.  
  186.   VAR len2 : INTEGER;
  187.  
  188. BEGIN (* Fill *)
  189.   IF pos < (SHORT (LEN (str)) - 1) THEN
  190.     len := Min (len, SHORT (LEN (str)) - pos - 1);
  191.     len2 := Max (Strings.Length (str), pos + len);
  192.     WHILE len > 0 DO
  193.       str [pos] := char; INC (pos); DEC (len)
  194.     END; (* WHILE *)
  195.     str [len2] := 0X;
  196.   END
  197. END Fill;
  198.  
  199.  
  200. (*------------------------------------*)
  201. PROCEDURE ToLower *
  202.   (VAR str : ARRAY OF CHAR);
  203.  
  204.   VAR index : INTEGER; ch : CHAR;
  205.  
  206. BEGIN (* ToLower *)
  207.   index := 0; ch := str [0];
  208.   WHILE ch # 0X DO
  209.     IF ((ch >= "A") & (ch <= "Z")) OR ((ch >= "À") & (ch <= "ß")) THEN
  210.       ch := CHR (ORD (ch) + 32); str [index] := ch
  211.     END;
  212.     INC (index); ch := str [index]
  213.   END;
  214. END ToLower;
  215.  
  216. END Strings2.
  217.